home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok24.lha / Updates / ExDos.mod next >
Text File  |  1993-08-15  |  4KB  |  158 lines

  1. (**********************************************************************
  2.  
  3.     :Program.    ExDos.mod
  4.     :Contents.   Dos operations, safe and tolerant
  5.     :Author.     Nicolas Benezan [bne]
  6.     :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
  7.     :Phone.      711/333679
  8.     :Copyright.  Public Domain
  9.     :Language.   Modula-2
  10.     :Translator. M2Amiga AMSoft V3.2d
  11.     :History.    V1.0b [bne] 24.Apr.1989
  12.     :History.    V1.1a [bne] 13.Aug.1989 (startup modified)
  13.  
  14. **********************************************************************)
  15.  
  16. IMPLEMENTATION MODULE ExDos;
  17.  
  18. FROM Arts       IMPORT Assert, TermProcedure;
  19. FROM Exec       IMPORT AllocMem, CopyMemQuick, FindTask, FreeMem,
  20.                        MemReqSet;
  21. FROM SYSTEM     IMPORT ADR, BYTE, CAST, LONGSET, SETREG;
  22. IMPORT Dos;
  23.  
  24. CONST
  25.   UnLockNoLock    = "ExDos: UnLocked unknown lock";
  26.   UnLockCurrentDir= "ExDos: UnLocked current dir";
  27.   StartupFail     = "ExDos. startup failure";
  28.  
  29. TYPE
  30.   FileLockNodePtr   = POINTER TO FileLockNode;
  31.   FileLockNode=RECORD
  32.     next:FileLockNodePtr;
  33.     lock:Dos.FileLockPtr;
  34.   END;
  35.  
  36. VAR
  37.   Root:FileLockNodePtr;
  38.   Info:RECORD pad1,pad2,pad3:BYTE; block:FileInfoBlock END;
  39.   InfoPtr:Dos.FileInfoBlockPtr;
  40.   CurrentDir:FileLockPtr;
  41.   OriginDir:Dos.FileLockPtr;
  42.   Process: Dos.ProcessPtr;
  43.  
  44. (* $R- $V- $F- *)
  45. PROCEDURE AddLock(DosLock:Dos.FileLockPtr):FileLockPtr;
  46.   VAR
  47.     Node:FileLockNodePtr;
  48.   BEGIN
  49.     IF DosLock#NIL THEN
  50.       Node:=AllocMem(SIZE(Node^),MemReqSet{});
  51.       IF Node#NIL THEN
  52.         WITH Node^ DO
  53.           next:=Root;
  54.           lock:=DosLock;
  55.         END;
  56.         Root:=Node;
  57.         RETURN DosLock;
  58.       ELSE
  59.         Dos.UnLock(DosLock);
  60.       END;
  61.     END;
  62.     RETURN NIL;
  63.   END AddLock;
  64.  
  65. PROCEDURE Lock(Name:ARRAY OF CHAR;Mode:LockMode):FileLockPtr;
  66.   BEGIN
  67.     RETURN AddLock(Dos.Lock(ADR(Name),Mode));
  68.   END Lock;
  69.  
  70. PROCEDURE UnLock(Lock:FileLockPtr);
  71.   VAR
  72.     Node,Last:FileLockNodePtr;
  73.   BEGIN
  74.     IF Lock#NIL THEN
  75.       Assert(Lock#CurrentDir,ADR(UnLockCurrentDir));
  76.       Node:=Root;
  77.       Last:=ADR(Root);
  78.       WHILE Node#NIL DO
  79.         IF Node^.lock=Lock THEN
  80.           Last^.next:=Node^.next; (* remove Node^ *)
  81.           Dos.UnLock(Node^.lock);
  82.           FreeMem(Node,SIZE(Node^));
  83.           RETURN
  84.         END;
  85.         Last:=Node;
  86.         Node:=Node^.next;
  87.       END;
  88.       Assert(FALSE,ADR(UnLockNoLock));
  89.     END;
  90.   END UnLock;
  91.  
  92. PROCEDURE DupLock(Lock:FileLockPtr):FileLockPtr;
  93.   BEGIN
  94.     RETURN AddLock(Dos.DupLock(Lock));
  95.   END DupLock;
  96.  
  97. PROCEDURE ParentDir(Dir:FileLockPtr):FileLockPtr;
  98.   BEGIN
  99.     RETURN AddLock(Dos.ParentDir(Dir));
  100.   END ParentDir;
  101.  
  102. PROCEDURE CreateDir(Name:ARRAY OF CHAR):FileLockPtr;
  103.   BEGIN
  104.     RETURN AddLock(Dos.CreateDir(ADR(Name)));
  105.   END CreateDir;
  106.  
  107. PROCEDURE Examine(Lock:FileLockPtr;VAR Info:FileInfoBlock):BOOLEAN;
  108.   BEGIN
  109.     IF (Lock#NIL) AND (Dos.Examine(Lock,InfoPtr)) THEN
  110.       CopyMemQuick(InfoPtr,ADR(Info),SIZE(Info));
  111.       RETURN TRUE;
  112.     END;
  113.     RETURN FALSE;
  114.   END Examine;
  115.  
  116. PROCEDURE ExNext(Lock:FileLockPtr;VAR Info:FileInfoBlock):BOOLEAN;
  117.   BEGIN
  118.     IF (Lock#NIL) AND (Dos.ExNext(Lock,InfoPtr)) THEN
  119.       CopyMemQuick(InfoPtr,ADR(Info),SIZE(Info));
  120.       RETURN TRUE;
  121.     END;
  122.     RETURN FALSE;
  123.   END ExNext;
  124.  
  125. PROCEDURE SetCurrentDir(Lock:FileLockPtr);
  126.   BEGIN
  127.     IF Lock#NIL THEN
  128.       CurrentDir:=Lock;
  129.       SETREG(0,Dos.CurrentDir(Lock));
  130.     END;
  131.   END SetCurrentDir;
  132.  
  133. PROCEDURE GetCurrentDir():FileLockPtr;
  134.   BEGIN
  135.     RETURN CurrentDir;
  136.   END GetCurrentDir;
  137.  
  138. PROCEDURE Cleanup;
  139.   BEGIN
  140.     SetCurrentDir(OriginDir);
  141.     WHILE Root#NIL DO
  142.       UnLock(Root^.lock);
  143.     END;
  144.   END Cleanup;
  145.  
  146. BEGIN
  147.   Root:=NIL;
  148.   Process:=CAST(Dos.ProcessPtr, FindTask(NIL));
  149.   CurrentDir:=Process^.currentDir;
  150.   OriginDir:=CurrentDir;
  151.   TermProcedure(Cleanup);
  152.   SetCurrentDir(DupLock(OriginDir));
  153.   Assert(CurrentDir#OriginDir, ADR(StartupFail));
  154.   InfoPtr:=CAST(Dos.FileInfoBlockPtr,
  155.                 CAST(LONGSET, ADR(Info.block))-LONGSET{0, 1});
  156. END ExDos.
  157.  
  158.